package com.small.nine.wxmp.domain.bean.wx.template;

import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.small.nine.wxmp.common.JsonService;
import com.small.nine.wxmp.utils.wx.JsonUtils;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 微信模板消息
 *
 * @author sheng_zs@126.com
 * @date 2021-08-13 18:08
 */
@Data
public class WxTemplateMsgBean implements JsonService {
    private static final long serialVersionUID = -1471581872778193296L;

    /**
     * 接收者openid
     */
    @JsonProperty("touser")
    private String toUser;

    /**
     * 模板ID
     */
    @JsonProperty("template_id")
    private String templateId;

    /**
     * 模板跳转链接（海外帐号没有跳转能力）
     */
    private String url;

    /**
     * 跳小程序所需数据，不需跳小程序可不用传该数据
     */
    @JsonProperty("miniprogram")
    private MiniProgram miniProgram;

    /**
     * 模板数据
     */
    private Map<String, TemplateData> data;

    /**
     * 初始化，设置 小程序 请调 {setProgram} 方法，添加数据请调 {addTemplateData} 方法
     *
     * @param toUser     接收者openid
     * @param templateId 模板ID
     * @param url        模板跳转链接（海外帐号没有跳转能力）
     * @return {@link WxTemplateMsgBean}
     */
    public static WxTemplateMsgBean getInstance(String toUser, String templateId, String url) {
        WxTemplateMsgBean msgBean = new WxTemplateMsgBean();
        msgBean.setToUser(toUser);
        msgBean.setTemplateId(templateId);
        msgBean.setUrl(url);
        return msgBean;
    }

    /**
     * 设置小程序
     *
     * @param appId    所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系，暂不支持小游戏）
     * @param pagePath 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar），要求该小程序已发布，暂不支持小游戏
     * @return {@link WxTemplateMsgBean}
     */
    public WxTemplateMsgBean setProgram(String appId, String pagePath) {
        MiniProgram miniProgram = new MiniProgram();
        miniProgram.setAppId(appId);
        miniProgram.setPagePath(pagePath);
        this.setMiniProgram(miniProgram);
        return this;
    }

    /**
     * 添加模板数据
     *
     * @param key   模板数据的 key
     * @param value 模板数据的 value
     * @param color 模板数据 value 的颜色
     * @return {@link WxTemplateMsgBean}
     */
    public WxTemplateMsgBean addTemplateData(String key, String value, String color) {
        if (StrUtil.isBlank(key)) {
            throw new IllegalArgumentException("模板消息的 key 不能为空！");
        }
        TemplateData templateData = new TemplateData();
        templateData.setValue(value);
        templateData.setColor(color);
        if (Objects.isNull(this.getData())) {
            this.setData(new HashMap<>());
        }

        this.data.put(key, templateData);
        return this;
    }

    @Override
    public String toJson() {
        return JsonUtils.writeValueAsString(this);
    }

    /**
     * 跳小程序所需数据，不需跳小程序可不用传该数据
     */
    @Data
    static class MiniProgram implements Serializable {
        private static final long serialVersionUID = 3580966559808247662L;

        /**
         * 所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系，暂不支持小游戏）
         */
        @JsonProperty("appid")
        private String appId;

        /**
         * 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar），要求该小程序已发布，暂不支持小游戏
         */
        @JsonProperty("pagepath")
        private String pagePath;
    }

    /**
     * 模板数据
     */
    @Data
    static class TemplateData implements Serializable {
        private static final long serialVersionUID = 5867853545869255342L;

        /**
         * 模板内容
         */
        private String value;

        /**
         * 模板内容字体颜色，不填默认为黑色
         */
        private String color;
    }
}
